package com.huazai.yangge.jmm;

import java.util.concurrent.TimeUnit;

/**
 * @author huazai
 * @date 2024/2/23
 */
public class VolatileDemo {
    // 如果加了volatile 保证了变量的可见性
    //static volatile boolean flag = true;
    static boolean flag = true;

    /**
     * volatile  可见，有序， 不满足原子性 当写一个Volatie 变量时，JMM会把该线程对应的本地内存中的共享变量立即写到主内存中
     * 当读一个volatie变量时，jmm会把该线程对应的本地内存设置为无效，读的语意是直接冲主内存中读取最新的共享变量
     * 所以volatile的写内存就是直接刷新到主内存中，读就是直接从主内存中读取
     */
// 线程 《--》 工作内存《--》主内存   线程不能直接访问主内存
    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "come in ");
            while (flag) {

            }
            System.out.println(Thread.currentThread().getName() + "\t ----flag被设置为false， 程序停止 ");
        }, "t1").start();

        TimeUnit.SECONDS.sleep(2);
        flag = false;
        System.out.println(Thread.currentThread().getName() + "\t ----flag修改完成, flag = " + flag);
    }
}
